import { Base } from '../../utils/base.js';

/**
 * 购物车数据存在本地
 * 当用户选中某些商品下单购买时，会从缓存中删除该数据，更新缓存
 * 当用户全部购买时，直接删除整个缓存
 */
class Cart extends Base {
  constructor() {
    super();
    this._storageKeyName = 'cart';
  };

  /**
   * 获取购物车
   * @param boolean flag 是否过滤掉不下单的商品
   */
  getCartDataFromLocal(flag) {
    var res = wx.getStorageSync(this._storageKeyName);
    if (!res) {
      res = [];
    }
    // 在下单的时候过滤掉不下单的商品
    if (flag) {
      var newRes = [];
      for (let i = 0; i < res.length; i++) {
        if (res[i].selectStatus) {
          newRes.push(res[i]);
        }
      }
      res = newRes;
    }
    return res;
  };

  /**
   * 获得购物车商品总数目，包括分类和不分类
   * @param boolean flag 是否区分选中和不选中
   * counts1 购物车所有商品数量
   * counts2 购物车商品种类数量
   */
  getCartTotalCounts(flag) {
    var cartData = this.getCartDataFromLocal(), counts1 = 0, counts2 = 0;
    for (let i = 0; i < cartData.length; i++) {
      if (flag) {
        if (cartData[i].selectStatus) {
          counts1 += cartData[i].counts;
          counts2++;
        }
      } else {
        counts1 += cartData[i].counts;
        counts2++;
      }
    }
    return {
      counts1:counts1,
      counts2:counts2
    };
  }

  /**
   * 加入到购物车
   * 如果之前没有这件商品，则直接添加一条新的记录，数量为counts
   * 如果有，则将相应的商品数量+counts
   * @param object item 传入的商品信息
   * @param int counts 传入的数量
   */
  add(item, counts) {
    var cartData = this.getCartDataFromLocal(); // 获取当前购物车信息
    if (!cartData) {
      cartData = [];
    }
    var isHasInfo = this._isHasThatOne(item.id, cartData); // 判断要增加的商品是否在购物车中
    if (isHasInfo.index != -1) {
      // 商品已在购物车中
      cartData[isHasInfo.index].counts += counts;
    } else {
      // 商品不在购物车中，新增商品进入购物车
      item.counts = counts;
      item.selectStatus = true;
      cartData.push(item);
    }
    this.execSetStorageSync(cartData);
    return cartData;
  };

  /**
   * 修改商品条目
   */
  _changeCounts(id,counts){
    var cartData = this.getCartDataFromLocal(),
    hasInfo = this._isHasThatOne(id,cartData);
    if(hasInfo.index != -1){
      if(hasInfo.data.counts > 1){
        cartData[hasInfo.index].counts += counts;
      }
    }
    this.execSetStorageSync(cartData);
  }

  /**
   * 增加商品数目
   */
  addCounts(id){
    this._changeCounts(id,1);
  };

  /**
   * 减少商品条目
   */
  cutCounts(id){
    this._changeCounts(id,-1);
  }

  /**
   * 检查购物车中是否已经有该商品
   * @param int id 商品id
   * @param array arr 从本地取出的购物车数据
   */
  _isHasThatOne(id, arr) {
    var result = { index: -1 };
    for (let i = 0; i < arr.length; i++) {
      if (arr[i].id == id) {
        result = {
          index: i,
          data: arr[i]
        };
        break;
      }
    }
    return result;
  };

  /**
   * 从购物车中删除某些商品
   */
  delete(ids) {
    if (!(ids instanceof Array)) {
      ids = [ids];
    }
    var cartData = this.getCartDataFromLocal();
    for (let i = 0; i < ids.length; i++) {
      var hasInfo = this._isHasThatOne(ids[i], cartData);
      if (hasInfo.index != -1) {
        cartData.splice(hasInfo.index, 1); // 删除数组指定下标
      }
    }
    this.execSetStorageSync(cartData);
  };

  /**
   * 更新或者新增本地缓存
   */
  execSetStorageSync(data) {
    wx.setStorageSync(this._storageKeyName, data);
  }
}

export { Cart };